/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.bitoon.basketdudes.ws;

import com.bitoon.basketdudes.jpa.Acumulado;
import com.bitoon.basketdudes.jpa.Acumuladowbc;
import com.bitoon.basketdudes.jpa.CruceDivision;
import com.bitoon.basketdudes.jpa.Elo;
import com.bitoon.basketdudes.jpa.Equipo;
import com.bitoon.basketdudes.jpa.Parcial;
import com.bitoon.basketdudes.jpa.PersistenceManager;
import com.bitoon.basketdudes.jpa.RankingAcumulado;
import com.bitoon.basketdudes.jpa.RankingAcumuladoV;
import com.bitoon.basketdudes.jpa.RankingDivision;
import com.bitoon.basketdudes.jpa.RankingElo;
import com.bitoon.basketdudes.jpa.RankingTotales;
import java.io.PrintWriter;
import java.util.List;
import javax.persistence.ColumnResult;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityResult;
import javax.persistence.FieldResult;
import javax.persistence.NoResultException;
import javax.persistence.Query;
import javax.persistence.SqlResultSetMapping;


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;

/**
 * Clase para dar soporte a las Consultas de Ranking 
 * de la WBCStar
 * Created on : 27-nov-2012, 12:38
 * @author pacoFELC
 */
public class RankWBCStar {
    Logger                  log = Logger.getLogger(Competicion.class);
    EntityManagerFactory    emf = null;
    EntityManager           m_em  = null;

    public RankWBCStar() {
        try {
            // JPA Units
            emf = PersistenceManager.getInstance().getEntityManagerFactory("jpa_basket");
        } catch (Exception e) {
            log.error("[ERROR][constructor]: No se puedo conectar a la base de datos: " , e);
        }
    }
    
    public void wsConsultarParcial( HttpServletRequest request, HttpServletResponse response ) {
    // Devuelve las victorias conseguidas en los enfrentamientos entre dos equipos 
    // si nunca se han enfrentado devuelve 0 victorias de ambos 
        EntityManager   em          = null;
        String          respuesta   = "";
        int             error       = -1;
        Parcial         parcial     = null;
        PrintWriter     out         = null;     

        try {
            out = response.getWriter();     
            em = emf.createEntityManager(); 
            int equipo1 = Integer.parseInt(request.getParameter("equipo1"));
            int equipo2 = Integer.parseInt(request.getParameter("equipo2"));

            Query q = em.createNamedQuery("Parcial.findByEquipo1Equipo2");
            if ( equipo1<equipo2 ) {
                q.setParameter("equipo1", equipo1);
                q.setParameter("equipo2", equipo2);
            } else {
                q.setParameter("equipo1", equipo2);
                q.setParameter("equipo2", equipo1);                
            }
            
            try {
                parcial= (Parcial)q.getSingleResult();
                respuesta = "victorias1="+parcial.getVictorias1()+
                           ",victorias2="+parcial.getVictorias2()+";";
                
            } catch (NoResultException nre) {
                respuesta = "victorias1=0,victorias2=0";
            }
            error=0;
        } catch (Exception e) {
            log.error("[wsLogin]: " , e);
            error = -2;
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
            if ( out != null)
                out.print ( "error="+error+";"+respuesta+";" );
        }
    }    
    
    public void wsConsultarMiRanking ( HttpServletRequest request, HttpServletResponse response ) {
    // Devuelve las victorias conseguidas en los enfrentamientos entre dos equipos 
    // si nunca se han enfrentado devuelve 0 victorias de ambos 
        EntityManager   em          = null;
        String          respuesta   = "";
        int             error       = 0;
        Parcial         parcial     = null;
        PrintWriter     out         = null;     
        Equipo          equipo      = null;
        XMLOutputter    xmlOut      = null;
        Document        doc         = null;
        Element         root        = null;
        int             zona_id     = 0;

        try {
            out     = response.getWriter();     
            root    = new Element("ranking");
            
            em      = emf.createEntityManager(); 
            int p_equipo_id = Integer.parseInt(request.getParameter("equipo_id"));
            
            equipo = BuscarEquipo( em, p_equipo_id );
            if ( equipo == null)
                throw new ExcepcionGeneral( -2, "Equipo no existe " + p_equipo_id );            
            zona_id=equipo.getZonaId();
            
            if ( equipo.getNivel() >14 ) {
                Elo  elo  = null;
                elo = BuscarElo ( em, p_equipo_id );
                if ( elo != null) {
                    root.setAttribute("zona"    , Integer.toString(elo.getZona()));
                    zona_id=elo.getZona();
                    root.setAttribute("division", Integer.toString(elo.getDivision()));
                    RankingElo ranking_elo = BuscarRankingElo( em, p_equipo_id );
                    if ( ranking_elo != null) {
                        root.setAttribute("ranking_elo",Integer.toString(ranking_elo.getPosicion()));
                        if ( elo.getDivision()>0) {
                            RankingDivision ranking_division = BuscarRankingDivision( em, p_equipo_id );                        
                            if ( ranking_division != null ) {
                                root.setAttribute("ranking_division",Integer.toString(ranking_division.getPosicion()));
                            }
                        }
                    } else {
                        root.setAttribute("ranking_elo","-1");
                    }
                } else {
                    throw new ExcepcionGeneral( -3, "ELO no existe " + p_equipo_id );
                }
            } else {
                EntityManager em2  = emf.createEntityManager(); 
                List<Acumuladowbc> l_acumulado  = null;
                l_acumulado = BuscarListaAcumuladowbc ( em, p_equipo_id);
                if ( l_acumulado != null && l_acumulado.size()>0) {    
                    Acumuladowbc acumuladowbc  = null;
                    String       dato_puntos    = "0";
                    String       dato_posicion  = "1";
//                    for ( int i=0;i<l_acumulado.size();i++ ) {
//                        Element elemento    = new Element("rank");                        
                        acumuladowbc = l_acumulado.get(0);
                        
                        root.setAttribute("zona"        , Integer.toString(acumuladowbc.getZonaId()));
                        zona_id=acumuladowbc.getZonaId();
                        root.setAttribute("categoria"   , Integer.toString(acumuladowbc.getCategoria()));
                        root.setAttribute("jugados"     , Integer.toString(acumuladowbc.getJugados()));                       
                        RankingAcumulado ranking_acumulado = BuscarRankingAcumuladoMayor( em2, p_equipo_id );
                        if ( ranking_acumulado != null) {
                            dato_posicion = Integer.toString(ranking_acumulado.getPosicion());
                            dato_puntos   = Integer.toString(ranking_acumulado.getPuntos());
                        }
                        root.setAttribute("ranking_acumulado", dato_posicion);
                        root.setAttribute("puntos", dato_puntos);
                } else {
                    root.setAttribute("zona"        , Integer.toString(zona_id) );     
                    // OJO NO CAMBIAR: Como la categoría 0 no existe, el cliente interpretará
                    // que llevas una semana sin jugar en tu categoría o bien que nunca has jugado.
                    root.setAttribute("categoria"   , "0");
                }
            }
            
            // Totales de ranking
            List<RankingTotales> l_totales = BuscarRankingTotales( em,  (short)zona_id );
            if ( l_totales != null) {    
                RankingTotales rt  = null;
                for ( int i=0;i<l_totales.size();i++ ) {
                    rt = l_totales.get(i);

                    if ( rt.getDivision()==0 ) {
                        Element ele_rank    = new Element("total");
                        ele_rank.setAttribute("categoria"   ,Integer.toString(rt.getCategoria()));
                        ele_rank.setAttribute("division"    ,Integer.toString(rt.getDivision()));
                        ele_rank.setAttribute("total"       ,Integer.toString(rt.getTotal()));
                        root.addContent(ele_rank);
                    }                    

                }
            }

                        
        } catch (ExcepcionGeneral ex) {
            log.error("[wsConsultarMiRanking]: " , ex);
            error = ex.getCodigo();            
        } catch (Exception e) {
            log.error("[wsConsultarMiRanking]: " , e);
            error = -1;
            try { em.getTransaction().rollback(); } catch (Exception e2) { }            
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
            if ( out != null) {
                root.setAttribute("error",Integer.toString(error));
                doc=new Document(root);//Creamos el documento
                //doc.setDocType(new DocType("text/xml"));
                doc.setDocType(null);
                xmlOut=new XMLOutputter();
                out.print ( xmlOut.outputString(doc) );
            }
        }
    }    
    
    private static final String CONTENT_TYPE = "text/xml";
    public void wsPaginaRanking ( HttpServletRequest request, HttpServletResponse response ) {
    // Devuelve las victorias conseguidas en los enfrentamientos entre dos equipos 
    // si nunca se han enfrentado devuelve 0 victorias de ambos 
        EntityManager   em          = null;
        int             error       = 0;
        PrintWriter     out         = null;     
        Query           qr          = null;
        List<RankingAcumulado>  lst1= null;
        List<RankingElo>        lst2= null;
        List<RankingDivision>   lst3= null;
        int p_tipo                  = 0;
        short p_categoria           = 0;
        try {
            response.setContentType(CONTENT_TYPE);
            out = response.getWriter();
            
            em      = emf.createEntityManager(); 
                p_tipo    = Integer.parseInt(request.getParameter("tipo"));
            short p_zona  = Short.parseShort(request.getParameter("zona"));
            int p_pos_ini = Integer.parseInt(request.getParameter("pos_ini"));
            int p_pos_fin = Integer.parseInt(request.getParameter("pos_fin"));

            switch ( p_tipo ) {
                case 1: // Acumulado
                    qr = em.createNamedQuery("RankingAcumulado.findByZonaYPosicion");
                    p_categoria = Short.parseShort(request.getParameter("categoria"));
                    break;
                case 2: // Elo
                    qr = em.createNamedQuery("RankingElo.findByZonaYPosicion");                    
                    break;
                case 3: // Division
                    qr = em.createNamedQuery("RankingDivision.findByZonaYPosicion");                    
                    p_categoria = Short.parseShort(request.getParameter("categoria"));
                    break;
                default:
                    throw new ExcepcionGeneral( -3, "Tipo incorrecto " + p_tipo );
            }
            qr.setParameter("zona", p_zona );
            qr.setParameter("pos_ini", p_pos_ini );
            qr.setParameter("pos_fin", p_pos_fin );
            
            switch ( p_tipo ) {
                case 1: // Acumulado
                    qr.setParameter("categoria", p_categoria );
                    lst1 = qr.getResultList();
                    break;
                case 2: // Elo
                    lst2 = qr.getResultList();
                    break;
                case 3: // Division
                    qr.setParameter("division", p_categoria );
                    lst3 = qr.getResultList();
                    break;
                default:
                    throw new ExcepcionGeneral( -3, "Tipo incorrecto " + p_tipo );
            }
            
            error=0;
        } catch (ExcepcionGeneral ex) {
            log.error("[wsPaginaRanking]: " , ex);
            error = ex.getCodigo();            
        } catch (Exception e) {
            log.error("[wsPaginaRanking]: " , e);
            error = -1;
            try { em.getTransaction().rollback(); } catch (Exception e2) { }            
        } finally {
            if ( out != null) {
                XMLCreator xml= new XMLCreator();
                switch ( p_tipo ) {
                    case 1: // Acumulado
                        xml.FormateaRanking(em,out,error,lst1,null,null);
                        break;
                    case 2: // Elo
                        xml.FormateaRanking(em,out,error,null,lst2,null);
                        break;
                    case 3: // Division
                        xml.FormateaRanking(em,out,error,null,null,lst3);
                        break;
                    default:
                        xml.FormateaRanking(em,out,error,null,null,null);
                }
            }
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
        }
    }        

    public void wsConsultarCruce( HttpServletRequest request, HttpServletResponse response ) {
    // Devuelve los identificadores de los equipos con los que ha jugado un equipo
    // en partidos de división actuales
        EntityManager   em          = null;
        String          respuesta   = "";
        int             error       = -1;
        Parcial         parcial     = null;
        PrintWriter     out         = null;     

        try {
            out = response.getWriter();     
            em = emf.createEntityManager(); 
            int equipo_id   = Integer.parseInt(request.getParameter("equipo_id"));
            int zona        = Integer.parseInt(request.getParameter("zona"));
            int division    = Integer.parseInt(request.getParameter("division"));

            Query q = em.createNamedQuery("CruceDivision.findByDivisionEquipoId");
            q.setParameter("zona"       , zona);
            q.setParameter("division"   , division);
            q.setParameter("equipo_id"  , equipo_id);
            List<CruceDivision> lista_cruce = q.getResultList();
            if ( lista_cruce != null ) {
                for ( int i=0;i<lista_cruce.size();i++ ) {
                    if ( i >0)
                        respuesta +=",";
                    if ( equipo_id != lista_cruce.get(i).getId().getEquipoId1() )
                        respuesta += lista_cruce.get(i).getId().getEquipoId1();
                    else
                        respuesta += lista_cruce.get(i).getId().getEquipoId2();
                }
            }
            error=0;
        } catch (Exception e) {
            log.error("[wsLogin]: " , e);
            error = -2;
            try { em.getTransaction().rollback(); } catch (Exception e2) { }
        } finally {
            try { em.close(); } catch (Exception e) { } // revisado 09/08/2012
            if ( out != null)
                out.print ( "error="+error+";");
                if ( respuesta.length() > 0)
                        out.print ( respuesta+";" );
        }
    }    
    
    
    public List<RankingTotales> BuscarRankingTotales( EntityManager em, short p_zona_id ) {
        Query qv = em.createNamedQuery("RankingTotales.findByZonaId");
        qv.setParameter("zona_id", p_zona_id );

        List<RankingTotales> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l;
        }
    }    
    
    public Elo BuscarElo( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("Elo.findByEquipoId");
        qv.setParameter("equipo_id", p_equipo_id );

        List<Elo> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l.get(0);
        }
    }
    public Equipo BuscarEquipo( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("Equipo.findById");
        qv.setParameter("idEquipo", p_equipo_id );

        List<Equipo> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l.get(0);
        }
    }
    public Acumulado BuscarAcumulado( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("Acumulado.findById");
        qv.setParameter("id", p_equipo_id );

        List<Acumulado> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l.get(0);
        }
    }
    public Acumuladowbc BuscarAcumuladowbc( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("Acumuladowbc.findByEquipoId");
        qv.setParameter("equipo_id", p_equipo_id );

        List<Acumuladowbc> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l.get(0);
        }
    }    
    public List<Acumuladowbc> BuscarListaAcumuladowbc( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("Acumuladowbc.findByEquipoId");
        qv.setParameter("equipo_id", p_equipo_id );

        List<Acumuladowbc> l = qv.getResultList();
        return l;
    }    
    
    public RankingElo BuscarRankingElo ( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("RankingElo.findByEquipoId");
        qv.setParameter("equipoId", p_equipo_id );

        List<RankingElo> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l.get(0);
        }
    }
    public RankingAcumulado BuscarRankingAcumuladoMayor ( EntityManager p_em, int p_equipo_id ) {
        List<RankingAcumulado> lista = null;
        
        Query qv = p_em.createNamedQuery("RankingAcumulado.findByEquipoId");
        qv.setParameter("equipoId",    p_equipo_id );

        lista = qv.getResultList();
        if ( !lista.isEmpty() ) {
            return lista.get(0);
        }
        return null;
    }
    public RankingDivision BuscarRankingDivision ( EntityManager em, int p_equipo_id ) {
        Query qv = em.createNamedQuery("RankingDivision.findByEquipoId");
        qv.setParameter("equipoId", p_equipo_id );

        List<RankingDivision> l = qv.getResultList();
        if ( l.isEmpty() ) {
            return null;
        } else {
            return l.get(0);
        }
    }
    
  
    
    
}
